package br.com.digicade.geosite.gpsavl.translator;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Properties;

public abstract class TranslationProperties implements Serializable {

	private static final long serialVersionUID = 1L;

	private Properties props;

	/**
	 * Carrega as propriedades para o idioma informado
	 * 
	 * @param language
	 *            Idioma a ser utilizado
	 */
	public void loadProperties(final String language) {

		InputStream in = null;

		try {

			final String fileName = this.getFileName(language);
			this.props = new Properties();

			in = ConfigProperties.class.getClassLoader().getResourceAsStream(
					fileName);

			this.props.load(in);

		} catch (final IOException e) {
			throw new RuntimeException(
					"Erro ao carregar o arquivo de propriedades", e);
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (final IOException e) {
					e.printStackTrace();
					throw new RuntimeException(
							"Erro ao fechar conexao com arquivo de propriedades.");
				}
			}
		}
	}

	/**
	 * Recupera o valor da propriedade informada.
	 * 
	 * @param key
	 *            Chave no arquivo de propriedades.
	 * @return Valor da chave no arquivo de propriedades.
	 */
	public String getProperty(final String key) {
		return this.getProperty(key, null);
	}

	/**
	 * Recupera o valor da propriedade informada.
	 * 
	 * @param key
	 *            Chave no arquivo de propriedades.
	 * @param params
	 *            Parametros que serao aplicados ao texto recuperado
	 * @return Valor da chave no arquivo de propriedades.
	 */
	public String getProperty(final String key, final String[] params) {
		String property = ""; 
		if (this.props != null && key != null) {
			// Todas as chaves devem ser inseridas em minusculo
			property = (String) this.props.get(key.toLowerCase());
			if (property!=null) {
				if (params != null && params.length > 0) {
					for (int i = 0; i < params.length; i++) {
						property = property.replaceFirst("\\{" + i + "\\}", params[i]);
					}
				}
			}
		}
		return property;
	}

	public Properties getProperties() {
		return this.props;
	}
	
	/**
	 * Recupera o nome do arquivo de propriedades
	 * 
	 * @param language
	 *            Idioma a ser utilizado
	 * @return Nome do arquivo de propriedades
	 */
	public abstract String getFileName(String language);
}
